#include <REGX52.H>
//引脚定义
sbit DS1302_SCLK = P3^6;
sbit DS1302_IO = P3^4;
sbit DS1302_CE = P3^5;

//寄存器写入地址/指令定义
#define DS1302_SECOND   0x80
#define DS1302_MINUTE   0x82
#define DS1302_HOUR     0x84
#define DS1302_DATE     0x86
#define DS1302_MONTH    0x88  
#define DS1302_DAY      0x8A 
#define DS1302_YEAR     0x8C
#define DS1302_WP       0x8E
//时间数组，索引0~6分别为年、月、日、时、分、秒、星期，设置为有符号的便于<0的判断
char DS1302_Time[] = {22,8,22,03,11,30,7};

/**
  * @brief  DS1302初始化
  * @param  无
  * @retval 无
  */
void DS1302_Init(void)
	{
    DS1302_CE = 0;
		DS1302_SCLK = 0;
  }

 /**
  * @brief  DS1302写一个字节
  * @param  Command 命令字/地址
  * @param  Data 要写入的数据
  * @retval 无
  */
 void DS1302_WriteByte(unsigned char Command,Data)
 {
	  unsigned char i;
	 	DS1302_CE = 1;
	 
//	  DS1302_IO = Command&0x01;//这里要先获取第0位来看是读还是写
//	  DS1302_SCLK = 1;//上升沿
//	  DS1302_SCLK = 0;//复位
    for(i=0;i<8;i++)
    {
		 DS1302_IO = Command&(0x01<<i);//位操作 非0即1 和移位寄存器类似
		 DS1302_SCLK = 1;
		 DS1302_SCLK = 0;
		};	 
		for(i=0;i<8;i++)
    {
		 DS1302_IO = Data&(0x01<<i);//位操作 非0即1 和移位寄存器类似
		 DS1302_SCLK = 1;
		 DS1302_SCLK = 0;
		};
     DS1302_CE = 0;  //CE关闭       
	 
	 
 } 
 
 /**
  * @brief  DS1302读一个字节
  * @param  Command 命令字/地址
  * @retval 读出的数据
  */
 unsigned char DS1302_ReadByte(unsigned char Command)
 {
   unsigned char i,Data=0x00;
	 Command|=0x01;//保证最低位是1 也就是读操作
	 //此时的妙处在于我们上面了定义的是写地址 这里我们只需要与上0x01
	 //就可以变成读地址了  避免了重复定义
	 DS1302_CE = 1;
	 for(i=0;i<8;i++)
     {
		  DS1302_IO = Command&(0x01<<i);//位操作 非0即1 和移位寄存器类似
		  DS1302_SCLK = 0;
		  DS1302_SCLK = 1;
		 };	
		 for(i=0;i<8;i++)
		  {
		    DS1302_SCLK = 1;
				DS1302_SCLK = 0;
				if(DS1302_IO){Data = Data|(0x01<<i);}//如果有数据就掷1 无数据就掷0
		  };
    DS1302_CE = 0;
		DS1302_IO = 0;
		return Data;
 
 }
 
 /**
  * @brief  DS1302设置时间，调用之后，DS1302_Time数组的数字会被设置到DS1302中
  * @param  无
  * @retval 无
  */
 void DS1302_SetTime(void)
 {
	 
  DS1302_WriteByte(DS1302_WP,0x00);//关闭写入保护
	DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
	DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
	DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
	DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
	DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
	DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
	DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
  DS1302_WriteByte(DS1302_WP,0x80);//写完打开写保护
 }
 
 /**
  * @brief  DS1302读取时间，调用之后，DS1302中的数据会被读取到DS1302_Time数组中
  * @param  无
  * @retval 无
  */
void DS1302_ReadTime(void)
 {
	unsigned char Temp;
  Temp = DS1302_ReadByte(DS1302_YEAR);
  DS1302_Time[0] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_MONTH);
  DS1302_Time[1] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_DATE);
  DS1302_Time[2] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_HOUR);
  DS1302_Time[3] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_MINUTE);
  DS1302_Time[4] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_SECOND);
  DS1302_Time[5] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_DAY);
  DS1302_Time[6] = Temp/16*10+Temp%16;
 }